package com.smartalarmclock.UI;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Iterator;
import java.util.Set;

import com.smartalarmclock.Logic.AcManager;
import com.smartalarmclock.Model.ILogEntry;
import com.smartalarmclock.Model.LogEntryFactory;
import com.smartalarmclock.Model.Exceptions.DataEntityDoesNotExistException;
import com.smartalarmclock.Model.Exceptions.InvalidDeleteDataEntityOperationException;
import com.smartalarmclock.Model.Exceptions.InvalidSaveDataEntityOperationException;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;

/**
 * A simple {@link android.support.v4.app.Fragment} subclass. Activities that
 * contain this fragment must implement the
 * {@link HistoryFragment.OnFragmentInteractionListener} interface to handle
 * interaction events. Use the {@link HistoryFragment#newInstance} factory
 * method to create an instance of this fragment.
 * 
 */
public class HistoryFragment extends Fragment
{
	public final static String EXTRA_MESSAGE = "com.smartalarmclocklocal.ui.uiimpl.MESSAGE";
	private ArrayList<LogListItem> m_ListLogs = new ArrayList<LogListItem>();
	private ListView m_ListViewLog;
	
	// TODO: Rename parameter arguments, choose names that match
	// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
	private static final String ARG_PARAM1 = "param1";
	private static final String ARG_PARAM2 = "param2";

	// TODO: Rename and change types of parameters
	private String mParam1;
	private String mParam2;

	private OnFragmentInteractionListener mListener;

	/**
	 * Use this factory method to create a new instance of this fragment using
	 * the provided parameters.
	 * 
	 * @param param1
	 *            Parameter 1.
	 * @param param2
	 *            Parameter 2.
	 * @return A new instance of fragment HistoryFragment.
	 */
	// TODO: Rename and change types and number of parameters
	public static HistoryFragment newInstance(String param1, String param2)
	{
		HistoryFragment fragment = new HistoryFragment();
		Bundle args = new Bundle();
		args.putString(ARG_PARAM1, param1);
		args.putString(ARG_PARAM2, param2);
		fragment.setArguments(args);
		return fragment;
	}

	public HistoryFragment() {
		// Required empty public constructor
	}

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		if (getArguments() != null) {
			mParam1 = getArguments().getString(ARG_PARAM1);
			mParam2 = getArguments().getString(ARG_PARAM2);
		}
	}

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		// Inflate the layout for this fragment
		View rootView = inflater.inflate(R.layout.log_list, container, false);
		int contactID = getActivity().getIntent().getIntExtra("CONTACT_ID", 0);
		m_ListLogs = GetSearchResults(contactID);

		
        // set listener for buttons
        final Button clearLogButton = (Button)rootView.findViewById(R.id.buttonClearSelectedLogs);
        clearLogButton.setOnClickListener(clearLogListener);
		
        // set profile list adapter and items on-click listener
        m_ListViewLog = (ListView)rootView.findViewById(R.id.log_list);
        m_ListViewLog.setAdapter(new LogListAdapter(rootView.getContext(), m_ListLogs));
        m_ListViewLog.setOnItemClickListener(logListItemClickListener);
        
        return rootView;
	}
	
	private OnItemClickListener logListItemClickListener = new OnItemClickListener() {
		@Override
    	public void onItemClick(AdapterView<?> a, View v, int position, long id) {
		    String logMessage = m_ListLogs.get(position).getLogMsg();
		    Intent logDetailsintent = new Intent(getActivity(), LogItemDetailsActivity.class);
		    logDetailsintent.putExtra(EXTRA_MESSAGE, logMessage); 
    		Log.v("startActivity(logDetailsintent);", "Start");
      		startActivity(logDetailsintent);
    		Log.v("startActivity(logDetailsintent);", "Finish");
      		
    		/*Object o = m_ListViewLog.getItemAtPosition(position);
        	LogListItem obj_itemDetails = (LogListItem)o;
    		Toast.makeText(HistoryActivity.this, "You have chosen : " + " " 
        	+ obj_itemDetails.getLogMsg(), Toast.LENGTH_LONG).show();*/
		}
	};
	
	private OnClickListener clearLogListener = new OnClickListener()
	{
    	@Override
        public void onClick(View v)
        {   
    		ArrayList<LogListItem> tmpListLogs = new ArrayList<LogListItem>();
    		tmpListLogs = (ArrayList<LogListItem>) m_ListLogs.clone();
    		LogEntryFactory logEntryFactory = new LogEntryFactory();
    		StringBuffer responseText = new StringBuffer();  
    		ILogEntry logEntry;
			 for(LogListItem log: tmpListLogs){
				 if(log.isSelected()){   
					 try {
						 logEntry = logEntryFactory.GetLogEntryById(getActivity(), log.getId());
						 logEntry.Delete(getActivity());
					} catch (DataEntityDoesNotExistException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					} catch (InvalidDeleteDataEntityOperationException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					} catch (InvalidSaveDataEntityOperationException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					 m_ListLogs.remove(log);
					 }  
				 }   
			 refresh();
		 }
    };
    
    private void refresh()
    {
  		final ListView logListView = (ListView)getActivity().findViewById(R.id.log_list);
        ArrayAdapter<LogListItem> arrayAdapter = (ArrayAdapter<LogListItem>)logListView.getAdapter();
		arrayAdapter.notifyDataSetChanged();
    }
    
    
    
    
	private ArrayList<LogListItem> GetSearchResults(int contactId) {
		final ArrayList<LogListItem> results = new ArrayList<LogListItem>();
		AcManager acManager = new AcManager();
		ILogEntry logEntry;
		Set<ILogEntry> logEntries = acManager.GetLogEntries(getActivity(), contactId);
		Iterator<ILogEntry> logIterator = logEntries.iterator();
		String logText;
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yy HH:mm");

		while (logIterator.hasNext()) {
			logEntry = logIterator.next();
			logText = simpleDateFormat.format(logEntry.GetTimestamp());
			if (logEntry.GetEvent() == ILogEntry.PhoneEvent.IncomingCall) {
				if (contactId > 0) {
					logText = logText + " - Called";
				} else {
					logText = logText + " - " + logEntry.GetContactName(getActivity()) + " called";
		}
			} else if (logEntry.GetEvent() == ILogEntry.PhoneEvent.SMSMessage) {
				if (contactId > 0) {
					logText = logText + " - Sent SMS";
				} else {
					logText = logText + " - " + logEntry.GetContactName(getActivity()) + " sent SMS";
					}
			}
								LogListItem logItem = new LogListItem(logEntry.GetContactName(getActivity()), logText, logEntry.GetId());
			logItem.setLogMsg(logEntry.GetSentSMSMessageString());
			results.add(logItem);
		}
		
    	return results;

	}

	@Override
	public void onAttach(Activity activity) {
		super.onAttach(activity);
		try {
			mListener = (OnFragmentInteractionListener) activity;
		} catch (ClassCastException e) {
			throw new ClassCastException(activity.toString()
					+ " must implement OnFragmentInteractionListener");
		}
	}

	@Override
	public void onDetach() {
		super.onDetach();
		mListener = null;
	}

	/**
	 * This interface must be implemented by activities that contain this
	 * fragment to allow an interaction in this fragment to be communicated to
	 * the activity and potentially other fragments contained in that activity.
	 * <p>
	 * See the Android Training lesson <a href=
	 * "http://developer.android.com/training/basics/fragments/communicating.html"
	 * >Communicating with Other Fragments</a> for more information.
	 */
	public interface OnFragmentInteractionListener {
		// TODO: Update argument type and name
		public void onFragmentInteraction(Uri uri);
	}

}
